#include <iostream>
#include <cstring>
using namespace std;

/*
	虚继承的底层原理(虚继承跟普通继承(没有使用virtual)的区别)：
	    1.如果一个子类虚继承了另外一个父类，子类的地址空间中会多出一个指针
		2.这个指针是干什么的？这个指针是用来指向虚基类表的首地址
*/
class Animal
{
public:
	Animal()
	{
		cout<<"Animal无参构造了"<<endl;
	}
	void eat()
	{
		cout<<"Animal eat"<<endl;
	}
};

class Catamount:virtual public Animal  //猫科动物
{
public:
	Catamount()
	{
		cout<<"Catamount无参构造"<<endl;
	}
private:
	int age;
};

class Mammal:virtual public Animal //哺乳动物
{
public:
	Mammal()
	{
		cout<<"Mammal无参构造"<<endl;
	}
};


class Leopard:public Mammal,public Catamount
{
public:
	Leopard()
	{
		cout<<"Leopard无参构造"<<endl;
	}
};

int main(int argc,char **argv)
{
	//验证子类虚继承了父类，子类的地址空间中是不是真的多出来一个指针
	cout<<"猫科大小: "<<sizeof(Catamount)<<endl;
	cout<<"哺乳大小: "<<sizeof(Mammal)<<endl;
	return 0;	
}